package serv

import (
	"context"
	"errors"
	"fmt"
	"generate_grom_mode_and_dao/service/genertategrom/api/internal/svc"
	"generate_grom_mode_and_dao/service/genertategrom/api/model"
	"generate_grom_mode_and_dao/service/genertategrom/api/util"
	"github.com/tal-tech/go-zero/core/logx"

	//"io/ioutil"
	"strings"
)

type GenerateXormModelService interface {
	Create(model.Table, *[]model.TableFields) error
}

type defaultGenerateXormModelService struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewGenerateXormModelService(ctx context.Context, svcCtx *svc.ServiceContext) *defaultGenerateXormModelService {
	return &defaultGenerateXormModelService{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (s defaultGenerateXormModelService) Create(table model.Table, fields *[]model.TableFields) error {

	//serviceDatabase := NewDatabaseService(s.ctx, s.svcCtx)
	//
	//serviceDatabase.
	serviceTableField := NewTableFieldService(s.ctx, s.svcCtx)
	var err error

	fieldList, err := s.svcCtx.DatabaseDao.GetAllColumnInfo("table_name = '" + table.Name + "'")
	if nil != err {
		return err
	}
	fmt.Println(fieldList)

	var builder strings.Builder
	_, err = builder.WriteString("package " + s.svcCtx.Config.GenerateModel.SavePackageNameXorm + "\n\n")
	if nil != err {
		return err
	}
	// 表注释
	if len(table.Comment) > 0 {
		builder.WriteString("// " + table.Comment + "\n")
	}
	// 生成结构体
	_, err = builder.WriteString("type " + util.Marshal(table.Name) + " struct {\n")
	if nil != err {
		return err
	}

	itemErr := make([]string, 0)

	for _, item := range *fieldList {

		//type EbHotmaxxUser struct {
		//	Id                 int       `json:"id" xorm:"not null pk autoincr comment('微信用户id') INT(10)"`
		//	RoutineOpenid      string    `json:"routine_openid" xorm:"comment('小程序唯一身份ID') VARCHAR(50)"`
		//	Nickname           string    `json:"nickname" xorm:"not null comment('用户的昵称') VARCHAR(64)"`
		//	Headimgurl         string    `json:"headimgurl" xorm:"comment('用户头像') VARCHAR(256)"`
		//	Sex                int       `json:"sex" xorm:"not null default 0 comment('用户的性别，值为1时是男性，值为2时是女性，值为0时是未知') TINYINT(1)"`
		//	City               string    `json:"city" xorm:"comment('用户所在城市') VARCHAR(64)"`
		//	Language           string    `json:"language" xorm:"comment('用户的语言，简体中文为zh_CN') VARCHAR(64)"`
		//	Province           string    `json:"province" xorm:"comment('用户所在省份') VARCHAR(64)"`
		//	Country            string    `json:"country" xorm:"comment('用户所在国家') VARCHAR(64)"`
		//	SessionKey         string    `json:"session_key" xorm:"comment('小程序用户会话密匙') VARCHAR(32)"`
		//	UserType           string    `json:"user_type" xorm:"default '0' comment('用户来源 1:好特卖小程序  2:crm') VARCHAR(32)"`
		//	Status             int       `json:"status" xorm:"default 1 comment('1为正常，0为禁止') TINYINT(1)"`
		//	Remark             string    `json:"remark" xorm:"comment('备注') VARCHAR(50)"`
		//	Phone              string    `json:"phone" xorm:"comment('手机号') VARCHAR(20)"`
		//	IsSystem           int       `json:"is_system" xorm:"default 0 comment('0:普通用户 1:系统管理') INT(1)"`
		//	RealName           string    `json:"real_name" xorm:"comment('真实姓名') VARCHAR(20)"`
		//	SystemStatus       int       `json:"system_status" xorm:"default 0 comment('后台管理员状态 1有效 0:无效') INT(11)"`
		//	RoleId             string    `json:"role_id" xorm:"default '0' comment('身份管理表id') VARCHAR(255)"`
		//	AddIp              string    `json:"add_ip" xorm:"comment('添加ip') VARCHAR(30)"`
		//	AddTime            int       `json:"add_time" xorm:"comment('添加时间') INT(11)"`
		//	LastIp             string    `json:"last_ip" xorm:"comment('最后一次登录ip') VARCHAR(30)"`
		//	LastTime           int       `json:"last_time" xorm:"comment('最后一次登录时间') INT(11)"`
		//	UpdatedAt          time.Time `json:"updated_at" xorm:"updated comment('最新一次更新时间') DATETIME"`
		//	ShortName          string    `json:"short_name" xorm:"VARCHAR(50)"`
		//	HdUid              string    `json:"hd_uid" xorm:"comment('海鼎采购员uid') index VARCHAR(50)"`
		//	WechatNo           string    `json:"wechat_no" xorm:"comment('企业微信用户编码') index VARCHAR(50)"`
		//	WorkDepartmentId   string    `json:"work_department_id" xorm:"not null default '' comment('企业微信部门id') VARCHAR(32)"`
		//	WorkDepartmentName string    `json:"work_department_name" xorm:"not null comment('企业微信部门名称') VARCHAR(32)"`
		//	ShopCode           string    `json:"shop_code" xorm:"comment('门店代码') TEXT"`
		//	BuyerType          int       `json:"buyer_type" xorm:"not null default 1 comment('人员类型 1常规 2爆款采购 2战略采购') TINYINT(1)"`
		//	Quota              string    `json:"quota" xorm:"not null default 0.00 comment('个人采购额') DECIMAL(14,2)"`
		//	CaigouOpenid       string    `json:"caigou_openid" xorm:"comment('采购小程序openid') VARCHAR(64)"`
		//	AuroraRegId        string    `json:"aurora_reg_id" xorm:"not null comment('极光推送的注册id') VARCHAR(32)"`
		//	IsData             int       `json:"is_data" xorm:"not null default 0 comment('是否有好特卖小程序权限 默认0:无 1:有') INT(1)"`
		//	HtmGuanjiaRoleId   int       `json:"htm_guanjia_role_id" xorm:"not null default 1 comment('好特卖管家身份id(1:普通用户 2:加盟商 3:采购员 4:超级管理员 5店长  6督导  7区经 8数据组 9:稽查 10:稽查老大)') INT(11)"`
		//	QrcodePath         string    `json:"qrcode_path" xorm:"comment('尾货宝二维码连接地址') VARCHAR(255)"`
		//	ApplyWarehouser    int       `json:"apply_warehouser" xorm:"comment('申请成为仓管') TINYINT(1)"`
		//	//DeletedAt          time.Time `json:"deleted_at" xorm:"deleted comment('删除时间') DATETIME"`
		//	CreatedAt   time.Time `json:"created_at" xorm:"created comment('创建时间') DATETIME"`
		//	LastLoginAt time.Time `json:"last_login_at" xorm:"comment('最后登录时间') DATETIME"`
		//	Position    string    `json:"position" xorm:"comment('用户职位') VARCHAR(52)"`
		//}

		fieldName := item.ColumnName

		tmpStr := "\t" + util.Marshal(fieldName) + "\t" + serviceTableField.GetFiledTypeCommon(item.DataType) + "\t" + "`"
		tmpStr = tmpStr + "xorm:\""

		if item.IsNullable == "NO" {
			tmpStr = tmpStr + " not null "
		}

		//autoincr
		tmpStr = tmpStr + ""

		//判读是否为空
		if item.ColumnDefault != "" {
			tmpStr = tmpStr + " default '" + item.ColumnDefault + "'"
		}
		//自增
		if item.Extra == "auto_increment" {
			tmpStr = tmpStr + " pk auto_increment "
		}
		//注释
		tmpStr = tmpStr + item.ColumnComment
		//
		tmpStr = "\t" + tmpStr + item.ColumnType

		tmpStr = tmpStr + "\""
		_, err := builder.WriteString(tmpStr)
		fmt.Println(err)
	}

	// 文件内容填充
	for _, field := range *fields {
		fieldName := field.Field
		/**
		字段名 字段类型 `json:"字段名" gorm:"column:字段名"` //注释
		*/

		tmpStr := "\t" + util.Marshal(fieldName) + "\t" + serviceTableField.GetFiledType(field) + "\t" + "`"
		tmpStr = tmpStr + "xorm:\""

		//判读是否为空

		tmpStr = tmpStr + "\""

		_, err := builder.WriteString(tmpStr)

		//return `json:"` + field.Field + `" ` + `gorm:"column:` + field.Field + `"`

		if nil != err {
			itemErr = append(itemErr, err.Error())
		}
	}
	if len(itemErr) != 0 {
		itemErrStr := strings.Join(itemErr, ",")
		return errors.New(itemErrStr)
	}
	_, err = builder.WriteString("}\n")
	if nil != err {
		return err
	}
	// 文件生成
	fileName := s.svcCtx.Config.GenerateModel.SavePathXorm + table.Name + ".go"
	util.MakeFile(s.svcCtx.Config.GenerateModel.SavePathXorm, fileName, builder.String(), s.svcCtx.Config.GenerateModel.ModelCover)

	return nil
}
